package com.wang.fuxi;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class date {
	public static void main(String[] args) throws ParseException {
		/**
		 *	Calendar: 日历相关抽象类，为了便于操作日期（加减日期，设置日期）和时间段
		 *		1. Calendar rightNow = Calendar.getInstance();获取一个对象
		 *		常用方法看下面的代码案例
		 *		SimpleDateFormat: 当日期的显示格式需要根据需求转换的时候，用SimpleDateFormat
		 *		Date:适用于具体某一刻时间，一般用在例如，订单时间、用户注册时间等
		 */
		//1. 获取日历对象：1. Calendar rightNow = Calendar.getInstance();获取一个对象
			Calendar rightNow = Calendar.getInstance();//获取一个对象,本质是创建子类对象，然后放到了父类Calendar的变量保存
			System.out.println(rightNow);
			/*
			 * 常用方法：
			 * 		1.abstract void add(int field, int amount)  添加时间操作
			 * 			field:是Calendar中的常量
			 * 			月份从：0-11	
			 * 			如果月份超过11，则进年，如果日期超过所在月份的最大或者最小一天，则进月或者退月
			 * 		2.int     get(int field)  	获取某一个字段（当前Calendar常量）的时间
			 * 		3.void    set(int field, int value)根据当前Calendar常量设置时间   
			 * 		4.Date    getTime()   将Calendar对象转换为Date类型
			 * 		5.void    setTime(Date date)  将Date转换为Calendar
			 * 		6.boolean after(Object when)  
			 * 		7.boolean before(Object when)  
			 */
			//1.abstract void add(int field, int amount)  添加时间操作
			rightNow.add(Calendar.MONTH,3);//如果第二个参数是正数，就是+，负数就是-
			//2.int get(int field)  	获取某一个字段（当前Calendar常量）的时间
			int year = rightNow.get(Calendar.YEAR);
			int month = rightNow.get(Calendar.MONTH);//月份是从:0-11
			int day = rightNow.get(Calendar.DAY_OF_MONTH);
			System.out.println(year + "年 " + month + "月" + day + "日" );//2020年 2月7日
			//3.void set(int field, int value)根据当前Calendar常量设置时间   
			rightNow.set(Calendar.YEAR, 2050);
			year = rightNow.get(Calendar.YEAR);
			month = rightNow.get(Calendar.MONTH);//月份是从:0-11
			day = rightNow.get(Calendar.DAY_OF_MONTH);
			System.out.println(year + "年 " + month + "月" + day + "日" );//2050年 2月7日
			//4.Date getTime()   将Calendar对象转换为Date类型
			Date time = rightNow.getTime();
			System.out.println(time);//Mon Mar 07 12:34:39 CST 2050
			//5.void setTime(Date date)  将Date转换为Calendar
			Date date = new Date();
			rightNow.setTime(date);
			year = rightNow.get(Calendar.YEAR);
			month = rightNow.get(Calendar.MONTH);//月份是从:0-11
			day = rightNow.get(Calendar.DAY_OF_MONTH);
			System.out.println(year + "年 " + month + "月" + day + "日" );//2019年 11月7日
			//6.boolean after(Object when)  
			//7.boolean before(Object when)  
			rightNow.set(Calendar.YEAR, 2022);
			Calendar now = Calendar.getInstance();
			boolean after = rightNow.after(now);
			System.out.println(after);//true
			/**
			 *	Date类：
			 *		适用于特定的某一刻时间的场景，如：订单时间
			 *		日期相关类，指具体某一刻的时间
			 *		1. 构造方法
			 *			1. Date() 
			 *			2. Date(long time) 
			 *		2. 普通方法
			 *			1. long getTime()将当前Date对象转换为long类型的时间毫秒数
			 *			2. void setTime(long time)将long类型时间毫秒数转换为对应的Date对象
			 *			3. before(Date date)判断是否在指定日期之前
			 *			4. after(Date date)判断是否在指定日期之后
			 */
			/*
			 * 创建对象：
			 * 	1. 构造方法
	 *				1. Date() 
	 *				2. Date(long time) //根据时间毫秒数，转换为对应的Date对象
			 */
			Date date1 = new Date();
			System.out.println(date1);//Sat Dec 07 12:49:57 CST 2019
			Date date3 = new Date(1L);
			System.out.println("距离1970年的时间："+date3);//距离1970年的时间：Thu Jan 01 08:00:00 CST 1970
			//调用方法
			//1. long getTime()将当前Date对象转换为long类型的时间毫秒数
			long time1 = date.getTime();//1575694339143
			long now1 = System.currentTimeMillis();//1575694339144
			//2. void setTime(long time)将long类型时间毫秒数转换为对应的Date对象
			//明天此刻的时间
			Date date2 = new Date();
			long tomorrow = now1 + 24 * 60 * 60 * 1000;
			date2.setTime(tomorrow);
			System.out.println("明天 ： " + date2);//明天 ： Sun Dec 08 12:52:19 CST 2019
			//3. before(Date date)判断是否在指定日期之前
			boolean before = date1.before(date2);//true
			//4. after(Date date)判断是否在指定日期之后
			boolean after1 = date1.after(date2);//false
			/**
			 *	简单时间格式化类：主要是解决现实格式问题
			 *		SimpleDateFormat：
			 *		构造方法：
			 *			SimpleDateFormat() 
						SimpleDateFormat(String pattern)  安照字符串模板格式，创建一个含有指定模板的SimpleDateFormat对象
			 *		1. 将Date转换为String类型
			 *			步骤：
			 *				1. 创建对象
			 *					SimpleDateFormat sdf = new SimpleDateFormat();
			 *				2. 准备String模板
			 *					String pattern = "2019年8月17日 11:47:11";
			 *				3. 应用模板
			 *					sdf.applyPattern(pattern);
			 *				4. 将Date转换为String
			 *					sdf.format(date);
			 *		2. 将String转换为Date类型
			 *			步骤：
			 *				1. 创建对象
			 *					SimpleDateFormat sdf = new SimpleDateFormat();
			 *				2. 准备String模板(必须和字符串结构一致)
			 *					String pattern = "2019年8月17日 11:47:11";		
			 *				3. 应用模板
			 *					sdf.applyPattern(pattern);
			 *				4. 将String转换为Date
			 *					sdf.parse(str);
			 *		以上1~3步可以合为一步，SimpleDateFormat(String pattern)  安照字符串模板格式，创建一个含有指定模板的SimpleDateFormat对象
			 */
			Date date11 = new Date();
			System.out.println(date11);//Sat Dec 07 14:53:57 CST 2019
			/*
			 * 1. 将Date转换为String类型
	 *			步骤：
	 *				1. 创建对象
	 *					SimpleDateFormat sdf = new SimpleDateFormat();
	 *				2. 准备String模板
	 *					String pattern = "2019年8月17日 11:47:11";
	 *				3. 应用模板
	 *					sdf.applyPattern(pattern);
	 *				4. 将Date转换为String
	 *					sdf.format(date);
			 */
			//1. 创建对象 
			SimpleDateFormat sdf = new SimpleDateFormat();
			//2.准备String模板
			String pattern = "yyyy年MM月dd日 HH:mm:ss";
			//3. 应用模板
			sdf.applyPattern(pattern);
			//4. 将Date转换为String
			String format = sdf.format(date11);
			System.out.println(format);//2019年12月07日 14:53:57
			/*
			 * 2. 将String转换为Date类型
	 *			步骤：
	 *				1. 创建对象
	 *					SimpleDateFormat sdf = new SimpleDateFormat();
	 *				2. 准备String模板(必须和字符串结构一致)
	 *					String pattern = "2019年8月17日 11:47:11";		
	 *				3. 应用模板
	 *					sdf.applyPattern(pattern);
	 *				4. 将String转换为Date
	 *					sdf.parse(str);
			 */
			String time11 = "2050-8-17 11:47:11";
			/*
			//1. 创建对象 
			SimpleDateFormat sdf2 = new SimpleDateFormat();
			//2.准备String模板
			String pattern2 = "yyyy-MM-dd HH:mm:ss";
			//3. 应用模板
			sdf2.applyPattern(pattern2);
			将上面3步合3为一
			*/
			//SimpleDateFormat(String pattern)  安照字符串模板格式，创建一个含有指定模板的SimpleDateFormat对象
			SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
			//4.将String转换为Date
			Date parse = sdf2.parse(time11);
			System.out.println(parse);//Wed Aug 17 11:47:11 CST 2050
			
	}
}
